//给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。 
//
// 说明：本题中，我们将空字符串定义为有效的回文串。 
//
// 示例 1: 
//
// 输入: "A man, a plan, a canal: Panama"
//输出: true
// 
//
// 示例 2: 
//
// 输入: "race a car"
//输出: false
// 
// Related Topics 双指针 字符串 
// 👍 311 👎 0


import java.util.stream.IntStream;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public static boolean isPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return true;
        }
        final byte[] bytes = s.getBytes();
        for (int i = 0, j = bytes.length - 1; i < j; ) {
            if (!isorNum(bytes[i])) {
                i++;
                continue;
            }
            if (!isorNum(bytes[j])) {
                j--;
                continue;
            }

            if (isNum(bytes[i]) && isNum(bytes[j]) && (bytes[i] - bytes[j] == 0)) {
                i++;
                j--;
            } else if (isChar(bytes[i]) && isChar(bytes[j]) && Math.abs(bytes[i] - bytes[j]) % 32 == 0) {
                i++;
                j--;
            } else {
                return false;
            }
        }
        return true;
    }

    private static boolean isorNum(byte c) {
        return (c > 47 && c < 58) || (c > 64 && c < 91) || (c > 96 && c < 123);
    }

    private static boolean isNum(byte c) {
        return c > 47 && c < 58;
    }

    private static boolean isChar(byte c) {
        return (c > 64 && c < 91) || (c > 96 && c < 123);
    }
}
//leetcode submit region end(Prohibit modification and deletion)
